class Rectangle {
  num left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);
  get square => width * height;//使用get作为前缀，getter来计算面积.
  set right(num value) => left = value - width;//使用set作为前缀，只接收一个参数value
  set bottom(num value) => top = value - height;//使用set作为前缀，只接收一个参数value
}

main() {
  var rect = Rectangle(3, 4, 20, 15);
  rect.right = 15;//调用setter函数时，可以直接使用类似属性赋值方式调用right函数。
  rect.bottom = 12;//调用setter函数时，可以直接使用类似属性赋值方式调用bottom函数。
  print('the rect square is ${rect.square}');//调用getter函数时，可以直接使用类似读取属性值方式调用square函数。
}
/**
 * 我们都知道函数一般描述动作行为，而属性则是描述状态数据结构(状态可能经过多个属性值计算得到)。 
 * 如果类中需要向外暴露类中某个状态那么更适合使用setter,getter函数；如果是触发类中的某个行为操作，那么普通函数更适合一点。
 */
